package com.itheima.tliasmanager.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/*

    AOP底层执行流程：
        1.web项目启动，spring框架扫描所有类
        2.将带有@Controller、@Service、@Repository、@Component的类进行实例化
            创建对象，存储到IOC容器中：Map集合（key=，value=）
            ------------------IOC容器--------------------------
             key(对象名称)        value(通过反射创建具体的对象)
             empController       目标对象
             deptController      目标对象
             empService          目标对象
             deptService         目标对象
             ...                  ...
            ---------------------------------------------
        3.判断类上是否添加了@Aspect注解，如果添加了，表示当前类是一个切面类
            3.1解析切面类中的通知方法上的切入点表达式，获取所有匹配到的切入点方法
              addEmp()/page()/deleteEmp()
            3.2获取当前方法所在的类信息
              EmpServiceImpl中的方法要增强
        4.对需要增强的方法的类，使用JDK和CGLib两种方式来创建当前类的代理对象
            ------------------IOC容器--------------------------
             key(对象名称)        value(通过反射创建具体的对象)
             empController       目标对象
             deptController      目标对象
             empService          目标对象-------》代理对象，覆盖原来对象
             deptService         目标对象
             ...                  ...
            ---------------------------------------------
        5.class  EmpContorller{
              @Autowired
              private  EmpService  empServiceProxy;  //代理对象

              public  void  test(){
                 empServiceProxy.saveEmp();
              }                     ↓
                                    ↓
          }                         ↓
                                    ↓
                                    ↓
                                    ↓
                                    ↓
                                    ↓
                                    ↓
        public  class  EmpServiceProxy{

                  void saveEmp(){

                       执行通知方法

                  }

        }
 */
/**
 * 1.定义类
 */
//6.设置当前类为功能增强的类
@Aspect  //标识当前类是一个可以进行增强的类
@Component //交给spring管理
public class RecordTimeAspect {

    //5.设置查找目标方法的表达式
    @Around("com.itheima.tliasmanager.aop.test.MyAspect1.yuBrother()")
    /**
     * 2.定义通知方法
     */                         //目标方法对象
    public Object recordTime(ProceedingJoinPoint  pjp) throws Throwable {

        //3.抽取统计耗时的公共代码，到方法中
        long start = System.currentTimeMillis();


        //4.执行目标方法：ProceedingJoinPoint
        Object  result = pjp.proceed();//调用目标方法


        //3.抽取统计耗时的公共代码，到方法中
        long end = System.currentTimeMillis();

        //3.抽取统计耗时的公共代码，到方法中
        String methodName = pjp.getSignature().getName();
        System.out.println(methodName+"耗时："+(end-start)+"ms");

        return result;
    }

}
